import numpy as np
import acl
import torch

def test_gelu():
    # 初始化ACL环境
    acl.init()
    
    # 生成测试数据
    np.random.seed(42)
    x = np.random.randn(1024).astype(np.float32)
    y = np.zeros_like(x)
    
    # 转换为Device张量
    x_dev = acl.util.numpy_to_ptr(x)
    y_dev = acl.util.numpy_to_ptr(y)
    
    # 执行算子
    stream = acl.rt.create_stream()
    gelu_custom(x_dev, y_dev, 1024, stream)
    acl.rt.synchronize_stream(stream)
    
    # 获取结果
    result = np.copy(y)
    
    # 计算参考结果
    ref = 0.5 * x * (1 + np.tanh(np.sqrt(2/np.pi) * (x + 0.044715 * x**3)))
    
    # 验证精度
    assert np.allclose(result, ref, atol=1e-4), f"最大误差: {np.max(np.abs(result - ref))}"
    print("GELU算子验证成功！")
    
    # 清理资源
    acl.rt.destroy_stream(stream)
    acl.finalize()

if __name__ == "__main__":
    test_gelu()